#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct Eric_cai
{
    int to,next;
};
Eric_cai EC[maxn<<1];
int head[maxn],cnt;
void add(int u,int v)
{
    EC[++cnt].to=v;
    EC[cnt].next=head[u];
    head[u]=cnt;
}
int n,f[maxn],id[maxn],num;
priority_queue<int> pq[maxn];
vector<int> g[maxn];
int ans;
void dfs(int now,int fa)
{
    int snum=0,fl=0;
    for(int i=head[now];i!=0;i=EC[i].next)
    {
        if(EC[i].to==fa) continue;
        snum++,g[now].push_back(EC[i].to);
        dfs(EC[i].to,now);
        if(pq[id[now]].size()<pq[id[EC[i].to]].size()) id[now]=id[EC[i].to];
    }
    if(id[now]==0) id[now]=++num;
    for(int i=head[now];i!=0;i=EC[i].next)
    {
        if(EC[i].to==fa) continue;
        if(id[EC[i].to]!=id[now])
        {
            while(!pq[id[EC[i].to]].empty())
            {
                pq[id[now]].push(pq[id[EC[i].to]].top());
                pq[id[EC[i].to]].pop();
            }
        }
    }
    if(snum==0) f[now]=1;
    if(snum>=2)
    {
        for(int i=0;i<g[now].size();i++) pq[id[now]].push(f[g[now][i]]);
        f[now]=pq[id[now]].top()+1,fl+=(pq[id[now]].top()%2==0);pq[id[now]].pop();
        f[now]+=pq[id[now]].top(),fl+=(pq[id[now]].top()%2==0);pq[id[now]].pop();
        if(fl==2) pq[id[now]].push(1),f[now]--;
    }
    if(snum==1)
    {
        if(pq[id[now]].size()==0) f[now]=f[g[now][0]]+1;
        else
        {
            f[now]=f[g[now][0]]+pq[id[now]].top()-(pq[id[now]].top()%2==0 && f[g[now][0]]%2==0)+1;
            if(pq[id[now]].top()%2==0 && f[g[now][0]]%2==0) pq[id[now]].push(1);
            pq[id[now]].pop();
        }
    }
}
int main()
{
    int u,v;
    freopen("bird.in","r",stdin);
    freopen("bird.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<n;i++)
    {
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(1,0);
    //for(int i=1;i<=n;i++) cout<<f[i]<<' ';
    //cout<<'\n';
    cout<<f[1]<<'\n';
    return 0;
}
